/*
 * Copyright 2010 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.schnipsel.div;

import java.io.InputStream;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.XMLStreamException;

import de.mnit.basis.crypt.JavaBase64;
import de.mnit.basis.daten.BenutzerEingabe;
import de.mnit.basis.daten.struktur.container.Engpass;
import de.mnit.basis.daten.typ.zeit.Datum;
import de.mnit.basis.daten.typ.zeit.Zeitpunkt;
import de.mnit.basis.fehler.Fehler;
import de.mnit.basis.fehler.benutzer.F_Benutzer;
import de.mnit.basis.swt.dialog.SWT_Fehler;
import de.mnit.basis.sys.Ausgabe;
import de.mnit.basis.sys.datei.DSLokal;
import de.mnit.basis.sys.datei.S_Datei;
import de.mnit.basis.sys.event.S_Zuhoerer;
import de.mnit.basis.xml.parser.XMLElement;
import de.mnit.basis.xml.parser.XMLParser;
import de.mnit.schnipsel.db.B_Schnipsel;
import de.mnit.schnipsel.db.DBManager;
import de.mnit.schnipsel.zentral.SC_Events;

/**
 * @author Michael Nitsche
 * 23.06.2010	Erstellt
 */
public class XMLImport {

	public static void main(String[] args) {
		try {
			DBManager.verbinden();
			//-----
			S_Datei datei=DSLokal.temp().dF("xmltest", "xml");
			XMLExport ex=new XMLExport();
			ex.generieren(datei.schreiben());
			//-----
			XMLImport in=new XMLImport();
			in.lies(datei.lesen());
		}
		catch(Throwable e) {
			Fehler.zeig(e);
		}
	}


	private final XMLParser xml;


	public XMLImport() throws ParserConfigurationException {
		xml=new XMLParser();
	}


	public void lies(InputStream is) throws XMLStreamException {
		DBManager.baum().leeren();
		DBManager.schnipsel().leeren();

//		this.xml.zuhoererPlus(new S_Zuhoerer<XMLElement>() {
//			public void verarbeite(XMLElement o) {
//				Ausgabe.debug("ALLE", o.gPfad(), o.gName());
//			}
//		});

		this.xml.zuhoererPlus(new String[]{"schnipsel","export"}, new S_Zuhoerer<XMLElement>() {
			public void verarbeite(XMLElement o) {
				int version=Integer.parseInt(o.gAttribut("version"));
				Ausgabe.debug("Version", version);
				if(version==1)
					Fehler.sonstige.da_ToDo("Version "+version+" wird nicht mehr unterstützt!");
				else if(version>2)
					Fehler.sonstige.da_ToDo(version);
			}
		});

		this.xml.zuhoererPlusTagEnde(new String[]{"schnipsel","export","tree","item"}, new S_Zuhoerer<XMLElement>() {
			public void verarbeite(XMLElement o) {
				String id	=o.gAttribut("id");
				String oben	=o.gAttribut("above");
				String titel=o.gAttribut("title");
				String crypt=o.gAttribut("crypt");
				String offen=o.gAttribut("open");
				String sort	=o.gAttribut("order");

				try {
					DBManager.baum().importiere(id, oben, titel, crypt, offen, sort);
				}
				catch(F_Benutzer e) {
					SWT_Fehler.zeig(e, false);
				}

//				Ausgabe.debug("Ast",
//					o.gAttribut("id"),
//					o.gAttribut("oben"),
//					o.gAttribut("titel"),
//					o.gAttribut("art"),
//					o.gAttribut("bild"));
			}
		});

		final Engpass<String> text=Engpass.neu();
		final Engpass<String> format=Engpass.neu();

		this.xml.zuhoererPlusTagEnde(new String[]{"schnipsel","export","item"}, new S_Zuhoerer<XMLElement>() {
			public void verarbeite(XMLElement o) {
				B_Schnipsel erg=new B_Schnipsel();
				String ast=o.gAttribut("tree");
				String ablauf=o.gAttribut("expire");
				try {
					//TODO Rest auch noch in "Typ" integrieren
					erg.ID.s(			BenutzerEingabe.zuInt(o.gAttribut("id")));
					erg.ERSTELLT.s(		Zeitpunkt.neu(o.gAttribut("create")));
					erg.GEAENDERT.s(	Zeitpunkt.neu(o.gAttribut("change")));
					erg.TITEL.s(		o.gAttribut("title"));
					erg.TEXT.s(			text.g());
					erg.FORMAT.s(		format.g());
					erg.KLICKS.s(		BenutzerEingabe.zuInt(o.gAttribut("clicks")));
					erg.AST.s(			ast==null ? null : Integer.parseInt(ast));
					erg.MUELL.s(		BenutzerEingabe.zuBool(o.gAttribut("trash")));
					erg.CRYPT_INHALT.s(	BenutzerEingabe.zuBool(o.gAttribut("crypt_content")));
					erg.ABLAUF.s(		ablauf==null ? null : Datum.neu(ablauf));
					DBManager.schnipsel().importiere(erg);
				}
				catch(F_Benutzer e) {
					SWT_Fehler.zeig(e, false);
				}

//				Ausgabe.debug("Schnipsel",
//					o.gAttribut("id"),
//					o.gAttribut("erstellt"),
//					o.gAttribut("geaendert"),
//					o.gAttribut("titel"),
//					o.gAttribut("klicks"),
//					o.gAttribut("ast"),
//					o.gAttribut("muell"),
//					o.gText()
//				);
			}
		});

		this.xml.zuhoererPlusTagEnde(new String[]{"schnipsel","export","item","text"}, new S_Zuhoerer<XMLElement>() {
			public void verarbeite(XMLElement o) {
				String t=o.gText();
				if(t==null)
					t="";
				t=new String(JavaBase64.entschluesseln(t));
				text.s(t);
//				Ausgabe.debug("Text", o.gText());
//				text.s(o.gText());
			}
		});

		this.xml.zuhoererPlusTagEnde(new String[]{"schnipsel","export","item","format"}, new S_Zuhoerer<XMLElement>() {
			public void verarbeite(XMLElement o) {
//				Ausgabe.debug("Format", o.gText());
				format.s(o.gText());
			}
		});

		this.xml.parse(is);
		SC_Events.i().neuVerbinden(); //Komplett neu verbinden
	}

}
